home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / modelers / geomview / source.lha / Geomview / src / bin / 4dview / 4dmap.C < prev    next >
C/C++ Source or Header  |  1993-11-17  |  11KB  |  431 lines

  1. #define poly ___poly
  2. extern "C" {
  3. #include <stdlib.h>
  4. #include "forms.h"
  5. #include "4dmapfd.h"
  6. }
  7. #undef  poly
  8. #include "4dmap.h"
  9.  
  10. #define X 0
  11. #define Y 1
  12. #define Z 2
  13. #define W 3
  14.  
  15. static FL_OBJECT **axes[4] = { &XInput, &YInput, &ZInput, &WInput };
  16.  
  17. // ===========================================================================
  18. // Internals of objects:
  19.  
  20. object4d::object4d()
  21. {
  22. }
  23.  
  24. object4d::~object4d()
  25. {
  26. }
  27.  
  28. object3d::object3d()
  29. {
  30. }
  31.  
  32. object3d::~object3d()
  33. {
  34. }
  35.  
  36.  
  37. int object4d::read4dfile(char *name)
  38. {
  39.  filename = new char[256];
  40.  int readworked;
  41.  
  42.  readworked = load_off_file(&polyhedron,&polyvertex,name,filename);
  43.  if (!readworked) return(0);
  44.  polyvertex.clip_vertex(1.0,1.0,1.0,1.0,100000.0,0); /*Doesn't clip anything*/
  45.  polyhedron.clip_polys(&polyvertex);
  46.  polyvertex.refresh_vertex_list();
  47.  polyhedron.refresh_poly_list();
  48.  delete filename;
  49.  return (1);
  50. }
  51.  
  52. object4d *object4d::copyobj()
  53. {
  54.  object4d *a=NULL;
  55.  return a;
  56. }
  57.  
  58. int object4d::clipobj(clip_plane *clipper, int *obj_loaded)
  59. {
  60.  polyvertex.clip_vertex(clipper->ax,clipper->by,clipper->cz,clipper->dw,
  61.             clipper->depth,0);
  62.  polyhedron.clip_polys(&polyvertex);
  63.  polyvertex.refresh_vertex_list();
  64.  polyhedron.refresh_poly_list();
  65.  if (polyvertex.numvtx<2) {*obj_loaded = 0;}
  66.  return (1);
  67. }
  68.  
  69. transform::transform()
  70. {
  71.   return;
  72. }
  73.  
  74. void transform::pipe3dout(FILE *fout, object4d *in, float T[4][4], clip_plane *clipper)
  75. {
  76.   fprintf(fout,"(geometry 4dthing {\n");
  77.   fprintf(fout,"COFF\n %d %d 1\n",in->polyvertex.numvtx,in->polyhedron.numpoly);
  78.   in->polyvertex.write_vertices3d(fout,T,clipper);
  79.   in->polyhedron.write_polys(fout);
  80.   fprintf(fout,"})\n");
  81.   fflush(fout);
  82. }
  83.  
  84. void transform::setproj(object4d *in, int proj)
  85. {
  86.  in->polyvertex.setproj(proj);
  87. }
  88.  
  89. void transform::fileout(char *filename, object4d *in)
  90. {
  91.  FILE *savefile;
  92.  
  93.  if (!(savefile=fopen(filename,"w")))
  94.  {
  95.   //fl_addto_browser(Browser, "Couldn\'t save file.");
  96.   return;
  97.  }
  98.  fprintf(savefile,"4OFF\n");
  99.  fprintf(savefile,"%d %d 1\n",in->polyvertex.numvtx,in->polyhedron.numpoly);
  100.  in->polyvertex.write_vertices(savefile);
  101.  in->polyhedron.write_polys(savefile);
  102.  fclose(savefile);
  103. }
  104.  
  105. void transform::copy(object4d *out, object4d *in)
  106. {
  107.  out = in->copyobj();
  108. }
  109.  
  110. main()
  111. {
  112.  
  113. // ===========================================================================
  114. //
  115. // Variables for the main loop...
  116. //
  117. //
  118.  
  119.   float slice_depth; // Var containing depth of slice for clipping
  120.   float T[4][4];     // Transformation Matrix
  121.   float TS[4][4];    // Slice Matrix
  122.   float upbnd,lowbnd;
  123.  
  124.   FL_OBJECT *retobj; // Object pointer used for polling forms
  125.   int i,j;           // indices for the transformation matrix
  126.   char str[255];     // String from input box
  127.   char fnm[255];     // File name
  128.   int file_load=0;
  129.   int obj_loaded=0;
  130.   FILE *pipeout;
  131.  
  132. // End of variables
  133. // ===========================================================================
  134. // Forms initialization
  135.  
  136.   foreground();      // Make debugging easier
  137.   fl_init();         // Initialize forms
  138.   create_the_forms();// Create forms
  139.  
  140.   fl_set_slider_bounds(SliceSlider, 0.0, 10.0);
  141.   fl_set_slider_value(SliceSlider, 0.0);
  142.   fl_set_slider_return(SliceSlider, TRUE);
  143.   fl_set_button(PerspButton, 1);
  144.   fl_set_button(ColorSchemeButton, 0);
  145.  
  146.   fl_show_form(MainPanel,
  147.     FL_PLACE_SIZE/*interactive placement*/,
  148.     TRUE/*border*/,
  149.     "4D-Viewer");
  150.  
  151. // End of Forms initialization
  152. // ===========================================================================
  153. // Object initialization
  154.  
  155.    object4d original;
  156.    clip_plane clipper;
  157.    transform ttool;
  158.  
  159.    original.polyvertex.colorscheme = 0;
  160.  
  161.    ttool.setproj(&original,1);
  162.    /*if (!(pipeout=fopen("mypipe","w")))
  163.    {
  164.     err_msg("Couldn\'t open pipe.\n");
  165.     exit(0);
  166.    }*/
  167.     pipeout = stdout;
  168.  
  169.     for (i=0;i<4;i++) {for(j=0;j<4;j++) {T[i][j] = 0.0;} T[i][i] = 1.0;}
  170.     for(i=0; i<4; i++) {
  171.     sprintf(str,"%7.3f %7.3f %7.3f %7.3f",T[0][i],T[1][i],T[2][i],T[3][i]);
  172.     fl_set_input(*axes[i],str);
  173.     }
  174.     fl_set_fouraxis_basis(ProjAxis, (float *)T);
  175.     fl_set_fouraxis_basis(SliceAxis, (float *)T);
  176.     fl_get_fouraxis_basis(SliceAxis, (float *)TS);
  177.     clipper.ax = TS[3][0];
  178.     clipper.by = TS[3][1];
  179.     clipper.cz = TS[3][2];
  180.     clipper.dw = TS[3][3];
  181.     slice_depth = fl_get_slider_value(SliceSlider);
  182.     clipper.depth = (double)slice_depth;
  183.     sprintf(str,"%f",TS[3][0]);
  184.     fl_set_input(AInput,str);
  185.     sprintf(str,"%f",TS[3][1]);
  186.     fl_set_input(BInput,str);
  187.     sprintf(str,"%f",TS[3][2]);
  188.     fl_set_input(CInput,str);
  189.     sprintf(str,"%f",TS[3][3]);
  190.     fl_set_input(DInput,str);
  191.     sprintf(str,"%f",clipper.depth);
  192.     fl_set_input(EInput,str);
  193.  
  194. // End of object initialization
  195. // ===========================================================================
  196.  
  197.  
  198. // The do loop from hell!!!
  199.  
  200.   do
  201.   {
  202.     /*if (fl_get_button(ProjTieButton))
  203.     {
  204.      fl_get_fouraxis_basis(ProjAxis, (float *)T);
  205.      for(i=0; i<4; i++) {
  206.     sprintf(str,"%7.3f %7.3f %7.3f %7.3f",T[0][i],T[1][i],T[2][i],T[3][i]);
  207.     fl_set_input(*axes[i],str);
  208.      }
  209.     }*/
  210.  
  211.     retobj = fl_do_forms();
  212.  
  213.     if (retobj==ShowProj)
  214.     {
  215.      fl_show_form(ProjectionPanel,
  216.     FL_PLACE_SIZE/*interactive placement*/,
  217.     TRUE/*border*/,
  218.     "Projection");
  219.     }
  220.     else
  221.     if (retobj==ShowSlice)
  222.     {
  223.      fl_show_form(SlicePanel,
  224.     FL_PLACE_SIZE,
  225.     TRUE,
  226.     "Slicing");
  227.     }
  228.     else 
  229.     if (retobj==SliceFlip)
  230.     {
  231.      clipper.ax*=(-1.0);
  232.      clipper.by*=(-1.0);
  233.      clipper.cz*=(-1.0);
  234.      clipper.dw*=(-1.0);
  235.      clipper.depth*=(-1.0);
  236.      slice_depth = clipper.depth;
  237.      sprintf(str,"%f",clipper.depth);
  238.      fl_set_input(EInput,str);
  239.      if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  240.     }
  241.     else
  242.     if (retobj==ProjCloseButton)
  243.       fl_hide_form(ProjectionPanel);
  244.     else
  245.     if (retobj==SliceCloseButton)
  246.       fl_hide_form(SlicePanel);
  247.     else
  248.     if (retobj==DefaultProj)
  249.     {
  250.      for (i=0;i<4;i++) {for(j=0;j<4;j++) {T[i][j] = 0.0;} T[i][i] = 1.0;}
  251.      for (i=0;i<4;i++)
  252.      {
  253.       sprintf(str,"%7.3f %7.3f %7.3f %7.3f",T[0][i],T[1][i],T[2][i],T[3][i]);
  254.       fl_set_input(*axes[i],str);
  255.      }
  256.      fl_set_fouraxis_basis(ProjAxis, (float *)T);
  257.      if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  258.  
  259.     }
  260.     else
  261.     if (retobj==ProjAxis)
  262.     {
  263.     if (1/*fl_get_button(ProjTieButton)*/)
  264.     {
  265.      fl_get_fouraxis_basis(ProjAxis, (float *)T);
  266.          for(i=0; i<4; i++) {
  267.       sprintf(str,"%7.3f %7.3f %7.3f %7.3f",T[0][i],T[1][i],T[2][i],T[3][i]);
  268.       fl_set_input(*axes[i],str);
  269.      }
  270.      if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  271.     }
  272.     }
  273.     else
  274.     if ((retobj==SliceAxis)||(retobj==AInput)||(retobj==BInput)||
  275.     (retobj==CInput)||(retobj==DInput))
  276.     {
  277.     if (retobj==SliceAxis)/*fl_get_button(SliceTieButton))*/
  278.     {
  279.      fl_get_fouraxis_basis(SliceAxis, (float *)TS);
  280.     }
  281.     else
  282.     {
  283.      TS[3][0]=0.0;TS[3][1]=0.0;TS[3][2]=0.0;TS[3][3]=0.0;
  284.      sscanf(fl_get_input(AInput), "%f", &TS[3][0]);
  285.      sscanf(fl_get_input(BInput), "%f", &TS[3][1]);
  286.      sscanf(fl_get_input(CInput), "%f", &TS[3][2]);
  287.      sscanf(fl_get_input(DInput), "%f", &TS[3][3]);
  288.     }
  289.     clipper.ax = TS[3][0];
  290.     clipper.by = TS[3][1];
  291.     clipper.cz = TS[3][2];
  292.     clipper.dw = TS[3][3];
  293.     sprintf(str,"%f",TS[3][0]);
  294.     fl_set_input(AInput,str);
  295.     sprintf(str,"%f",TS[3][1]);
  296.     fl_set_input(BInput,str);
  297.     sprintf(str,"%f",TS[3][2]);
  298.     fl_set_input(CInput,str);
  299.     sprintf(str,"%f",TS[3][3]);
  300.     fl_set_input(DInput,str);
  301.     if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  302.     }
  303.     else
  304.     if (retobj==ExtraButton)
  305.     {
  306.      fl_show_form(ExtraPanel,
  307.     FL_PLACE_SIZE/*interactive placement*/,
  308.     TRUE/*border*/,
  309.     "Features");
  310.     }
  311.     else
  312.     if (retobj==OrthoButton)
  313.     {
  314.      ttool.setproj(&original,0);
  315.      if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  316.     }
  317.     else
  318.     if (retobj==PerspButton)
  319.     {
  320.      ttool.setproj(&original,1);
  321.      if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  322.     }
  323.     else
  324.     if (retobj==ColorSchemeButton)
  325.     {
  326.       original.polyvertex.colorscheme = fl_get_button(retobj);
  327.      if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  328.     }
  329.     else
  330.     if (retobj==ExtraCloseButton)
  331.     {
  332.       fl_hide_form(ExtraPanel);
  333.     }
  334.     else
  335.     if (retobj==FileInput)
  336.     {
  337.     //fl_get_input(FileInput));
  338.     }
  339.     else 
  340.     if (retobj==SliceSlider)
  341.     {
  342.     slice_depth = fl_get_slider_value(SliceSlider);
  343.         sprintf(str,"%f",slice_depth);
  344.     clipper.depth = (double)slice_depth;
  345.     fl_set_input(EInput,str);
  346.     if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  347.     }
  348.     else
  349.     if (retobj==EInput)
  350.     {
  351.     sscanf(fl_get_input(retobj), "%f",&slice_depth);
  352.         //printf("Slice Value: %f\n",slice_depth);
  353.     clipper.depth = (double)slice_depth;
  354.     fl_set_slider_value(SliceSlider, (float) slice_depth);
  355.     if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  356.     }
  357.     else
  358.     if (retobj==SliceButton)
  359.     {
  360.         if (obj_loaded)
  361.     {
  362.      if (original.clipobj(&clipper,&obj_loaded));
  363.            //printf("Slice the object\n");
  364.      if (obj_loaded)
  365.       ttool.pipe3dout(pipeout,&original,T,&clipper);
  366.      else
  367.      {
  368.        fprintf(pipeout,"(delete 4dthing)\n");
  369.        fflush(pipeout);
  370.      }
  371.     }
  372.     }
  373.     else
  374.     /*if (retobj==UndoSliceButton)
  375.     {
  376.     if (file_load)
  377.      if (original.read4dfile(fnm))
  378.      {
  379.        sliderval(&lowbnd,&upbnd);
  380.        fl_set_slider_bounds(SliceSlider,lowbnd,upbnd);
  381.        obj_loaded=1;
  382.        ttool.pipe3dout(pipeout,&original,T,&clipper);
  383.      }
  384.     }*/
  385.     if (retobj==LoadFile)
  386.     {
  387.         //printf("Loading file...\n");
  388.     if (!(original.read4dfile(fl_get_input(FileInput))))
  389.         {
  390.       fprintf(stderr,"Couldn\'t read file.\n");
  391.        //fl_addto_browser(Browser,"Couldn\'t read file.");
  392.         }
  393.     else
  394.     {
  395.        strcpy(fnm,fl_get_input(FileInput));
  396.        sliderval(&lowbnd,&upbnd);
  397.        fl_set_slider_bounds(SliceSlider,lowbnd,upbnd);
  398.            fl_set_slider_value(SliceSlider, upbnd);
  399.            slice_depth = upbnd;
  400.            clipper.depth = (double)slice_depth;
  401.        sprintf(str,"%f",clipper.depth);
  402.        fl_set_input(EInput,str);
  403.            clipper.depth = (double)slice_depth;
  404.        //printf("Bounds set: %f %f\n",lowbnd,upbnd);
  405.        obj_loaded=1;
  406.        file_load=1;
  407.        ttool.pipe3dout(pipeout,&original,T,&clipper);
  408.     }
  409.     }
  410.     else
  411.     if (retobj==StoreFile)
  412.     {
  413.     if (obj_loaded)
  414.      ttool.fileout(fl_get_input(FileInput),&original);
  415.     }
  416.     else
  417.     {
  418.     for(i=0; i<4; i++) {
  419.       if(retobj == *axes[i]) {
  420.         /* Text input value changed: change fouraxis accordingly */
  421.         sscanf(fl_get_input(retobj), "%f %f %f %f",
  422.                 &T[0][i],&T[1][i],&T[2][i],&T[3][i]);
  423.              sprintf(str,"%7.3f %7.3f %7.3f %7.3f",T[0][i],T[1][i],T[2][i],T[3][i]);
  424.          fl_set_input(*axes[i],str);
  425.              if (obj_loaded) ttool.pipe3dout(pipeout,&original,T,&clipper);
  426.         }
  427.       }
  428.     }
  429.   } while (retobj != ExitButton);
  430. }
  431.